//
// Created by 86135 on 2025-06-06.
//

#ifndef COMPILER_CCV2_PARSER_H
#define COMPILER_CCV2_PARSER_H
#include "lexer.h"

// 定义抽象语法树节点类型
typedef enum {
    AST_PROGRAM,        // 程序根节点
    AST_BLOCK,          // 块语句
    AST_IF,             // if语句
    AST_EXPR_STMT,      // 表达式语句
    AST_BINARY_EXPR,    // 二元表达式
    AST_LITERAL,        // 字面量
    AST_EMPTY_STMT,     // 空语句
    AST_IDENTIFIER,     // 标识符
    //v4
    AST_ASSIGNMENT,     // 赋值表达式
    AST_LOGICAL_OR,     // 逻辑或
    AST_LOGICAL_AND,    // 逻辑与
    AST_EQUALITY,       // 相等比较
    AST_RELATIONAL,     // 关系比较
    //v5
    AST_WHILE,          // while语句
    AST_FOR,            // for语句
    AST_BREAK,          // break 语句
    AST_CONTINUE,       // continue 语句
    //v6
    AST_FUNCTION_DEF,       // 函数定义
    AST_FUNCTION_CALL,      // 函数调用
    AST_RETURN,             // return语句
    AST_DECLARATION,        // 变量声明
    AST_PARAMETER,          // 单个函数参数
    AST_TYPE_SPECIFIER,     // 类型说明符
    AST_ARGUMENT_LIST,      // 参数列表
    AST_PARAMETER_LIST,     // 新增：参数列表
    // ..   todo
} ASTNodeType;

// 定义抽象语法树节点结构
typedef struct ASTNode {
    ASTNodeType type;
    int line;
    struct ASTNode** children;
    int childCount;

    // 节点特定数据
    union {
        // 程序节点数据
        struct {
            struct ASTNode** declarations;
            int declCount;
        } program;

        // 块语句节点数据
        struct {
            struct ASTNode** statements;
            int stmtCount;
        } block;

        // if语句节点数据
        struct {
            struct ASTNode* condition;  // 条件表达式
            struct ASTNode* ifBody;     // if分支语句块
            struct ASTNode* elseBody;   // else分支语句块(可为NULL)
        } ifStmt;

        // 表达式语句节点数据
        struct {
            struct ASTNode* expr;
        } exprStmt;

        // 二元表达式节点数据
        struct {
            struct ASTNode* left;
            struct ASTNode* right;
            int operator;  // +, -, *, / 等
        } binaryExpr;

        // 字面量节点数据
        struct {
            double value;  // 目前只支持数值字面量
        } literal;

        // 标识符节点数据
        struct {
            char* name;
        } identifier;

        // 赋值节点数据
        struct {
            struct ASTNode* left;
            struct ASTNode* right;
            int operator;
        } assignment;

        // 逻辑或节点
        struct {
            struct ASTNode* left;
            struct ASTNode* right;
            int operator;
        } logicalOr;

        // 逻辑与节点
        struct {
            struct ASTNode* left;
            struct ASTNode* right;
            int operator;
        } logicalAnd;

        // 相等比较结点
        struct {
            struct ASTNode* left;
            struct ASTNode* right;
            int operator;
        } equality;

        // 关系比较节点
        struct {
            struct ASTNode* left;
            struct ASTNode* right;
            int operator;
        } relational;

        // while语句节点数据
        struct {
            struct ASTNode* condition;  // 循环条件
            struct ASTNode* body;       // 循环体
        } whileStmt;

        // for语句节点数据
        struct {
            struct ASTNode* init;      // 初始化表达式
            struct ASTNode* condition;  // 条件表达式
            struct ASTNode* update;     // 更新表达式
            struct ASTNode* body;       // 循环体
        } forStmt;

        // 函数定义结点
        struct {
            struct ASTNode* returnType;
            struct ASTNode* functionName;
            struct ASTNode* params;
            struct ASTNode* body;
        } functionDef;

        // 函数调用结点
        struct {
            struct ASTNode* functionName;
            struct ASTNode* arguments;
        } functionCall;

        // 返回语句
        struct {
            struct ASTNode* expr;
        } returnStmt;

        // 声明语句
        struct {
            struct ASTNode* typeSpec;
            struct ASTNode* identifier;
            struct ASTNode* initExpr;
        } declaration;

        // 参数
        struct {
            struct ASTNode* typeSpec;
            struct ASTNode* identifier;
        } parameter;

        // 类型识别符
        struct {
            TokenType type;
        } typeSpecifier;

        // 参数列表
        struct {
            struct ASTNode** items;
            int count;
        } argumentList;

        // todo..
    } data;
} ASTNode;

void freeASTNode(ASTNode* node);
ASTNode* parse(const char* source);
#endif //COMPILER_CCV2_PARSER_H
